package actions.customer;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;

import javax.persistence.EntityManager;
import javax.persistence.Query;

import org.jboss.seam.ScopeType;
import org.jboss.seam.annotations.Factory;
import org.jboss.seam.annotations.In;
import org.jboss.seam.annotations.Name;
import org.jboss.seam.annotations.Out;
import org.jboss.seam.annotations.Scope;
import org.jboss.seam.annotations.datamodel.DataModel;
import org.jboss.seam.annotations.datamodel.DataModelSelection;

import domain.Municipio;
import domain.Provincia;
import domain.Reserva;
import domain.Restaurante;
import domain.Usuario;


@Name("customer")
@Scope(ScopeType.SESSION)
@SuppressWarnings("all")
public class FindRestaurantAction implements Serializable {

	@In(required = false)
	Usuario usuarioAutenticado;

	@In
	EntityManager em;

	@DataModel
	private Set<Reserva> myBookings;
	
	@DataModelSelection("myBookings")
	Reserva myBooking;

	private String parametroBusquedaRapida;
	
	@DataModel
	private List<Restaurante> resultadosBusqueda = new ArrayList<Restaurante>();
	
	@DataModelSelection("resultadosBusqueda")
	private Restaurante restauranteSeleccionadoCliente;
	
	
	@Out(required = true)
	private Restaurante restauranteBusquedaAvanzada = new Restaurante();

	private List<Municipio> municipios;

	/***************************************************************************
	 * findMyBookings
	 * 
	 * @return lista de reservas del usuario Autenticado
	 */
	@Factory("myBookings")
	public Set<Reserva> findMyBookings() {
		Usuario u = em.find(Usuario.class, usuarioAutenticado.getUsuario());
		myBookings = u.getReservas();

		return myBookings;
	}

	
	public List<Restaurante> busquedaRapida(){
		

		Query q = em.createQuery("FROM Restaurante r WHERE (r.categoria.nombre LIKE '%" + parametroBusquedaRapida + "%' OR " +
				" r.email LIKE '%" + parametroBusquedaRapida + "%' OR r.municipio.nombre LIKE '%" + parametroBusquedaRapida + "%' OR " +
				" r.nombre LIKE '%" + parametroBusquedaRapida + "%' OR r.telefono LIKE '%" + parametroBusquedaRapida + "%') AND r.denegado = 0 AND r.revisado = 1");
		
		resultadosBusqueda = q.getResultList();
		
		if (resultadosBusqueda == null || resultadosBusqueda.isEmpty())
			resultadosBusqueda = new ArrayList<Restaurante>(0); 
		
		return resultadosBusqueda;
	}
	

	public List<Restaurante> busquedaAvanzada(){
		if(sinParametros())
			return new ArrayList<Restaurante>();
		
		String sql="FROM Restaurante r WHERE r.denegado = 0 AND r.revisado = 1 ";
		if (restauranteBusquedaAvanzada.getCategoria()!= null)
			sql += "AND r.categoria = " + restauranteBusquedaAvanzada.getCategoria().getCategoria()+" "; 
		
		if (restauranteBusquedaAvanzada.getEmail() != null && !restauranteBusquedaAvanzada.getEmail().equals(""))
			sql += "AND r.email LIKE '%" + restauranteBusquedaAvanzada.getEmail() + "%'";
		
		
		if( restauranteBusquedaAvanzada.getNombre()!= null && !restauranteBusquedaAvanzada.getNombre().equals(""))
			sql += "AND r.nombre LIKE '%" + restauranteBusquedaAvanzada.getNombre() + "%'";
		
		if( restauranteBusquedaAvanzada.getTelefono()!= null && !restauranteBusquedaAvanzada.getTelefono().equals(""))
			sql += "AND r.nombre LIKE '%" + restauranteBusquedaAvanzada.getTelefono() + "%'";
		
		if (restauranteBusquedaAvanzada.getMunicipio().getProvincia()!= null)
			sql += "AND r.municipio.provincia.provincia = " + restauranteBusquedaAvanzada.getMunicipio().getProvincia().getProvincia();
		
		sql += " AND r.permiteFumadores = " + (restauranteBusquedaAvanzada.isPermiteFumadores()?1:0);
		
		Query q = em.createQuery(sql);
		
		
		resultadosBusqueda = q.getResultList();
		
		if (resultadosBusqueda == null || resultadosBusqueda.isEmpty())
			resultadosBusqueda = new ArrayList<Restaurante>(0); 
		
		return resultadosBusqueda;
	}

	
	private boolean sinParametros() {
		if ((restauranteBusquedaAvanzada.getEmail() == null || restauranteBusquedaAvanzada.getEmail().equals(""))
			&&	(restauranteBusquedaAvanzada.getNombre()== null || restauranteBusquedaAvanzada.getNombre().equals(""))
			&&	(restauranteBusquedaAvanzada.getTelefono()== null || !restauranteBusquedaAvanzada.getTelefono().equals(""))
			&&	(restauranteBusquedaAvanzada.getMunicipio().getProvincia()== null)
			&&	(restauranteBusquedaAvanzada.getCategoria()== null)
			)
				return true;	
		else
			return false;
	}


	@SuppressWarnings("unchecked")
	public List<Municipio> findMunicipios() {
		Provincia provinciaRestaurante = restauranteBusquedaAvanzada.getMunicipio().getProvincia();
		if (provinciaRestaurante != null) {
			
				municipios = (List<Municipio>) em.createQuery(
						"FROM Municipio m WHERE m.provincia.provincia = "
								+ provinciaRestaurante.getProvincia())
						.getResultList();
				
		} else
			// Si no hay provincia seleccionada
			municipios = new ArrayList<Municipio>();

		return municipios;
	}
	
	
	public String seleccionaRestaurante(){
		System.out.println("hola");
		return "detallesRestaurante";
	}
	
	
	
	
	/****************Getters & Setters*************/
	public String getParametroBusquedaRapida() {
		return parametroBusquedaRapida;
	}

	public void setParametroBusquedaRapida(String parametroBusquedaRapida) {
		this.parametroBusquedaRapida = parametroBusquedaRapida;
	}


	
	
	
}
